package com.jojo.bubble.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author JoJo @Data 2021/9/2$ 17:19$ @Description @Param $ @Return $
 */
public class OrderNumUtil {
    // 使用单例模式，不允许直接创建实例

    private OrderNumUtil() {
    }

    // 创建一个空实例对象，类需要用的时候才赋值

    private static OrderNumUtil g = null;

    // 单例模式--懒汉模式

    public static synchronized OrderNumUtil getInstance() {
        if (g == null) {
            g = new OrderNumUtil();
        }
        return g;
    }

    // 全局自增数

    private static int count = 0;

    // 每毫秒秒最多生成多少订单（最好是像9999这种准备进位的值）

    private static final int total = 9999;

    // 格式化的时间字符串

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

    // 获取当前时间年月日时分秒毫秒字符串

    private static String getNowDateStr() {
        return sdf.format(new Date());
    }

    public static String getTodayStr() {
        return sdf.format(new Date()).substring(2, 12);
    }

    // 记录上一次的时间，用来判断是否需要递增全局数

    private static String now = null;

    // 生成一个订单号

    public synchronized String GenerateOrder() {
        String datastr = getTodayStr();
        if (datastr.equals(now)) {
            count++; // 自增
        } else {
            count = 1;
            now = datastr;
        }
        int countInteger = String.valueOf(total).length() - String.valueOf(count).length();
        // 算补位
        String bu = "";
        // 补字符串
        for (int i = 0; i < countInteger; i++) {
            bu += "0";
        }
        bu += String.valueOf(count);
        if (count >= total) {
            count = 0;
        }
        return datastr + bu;
    }

    public static void main(String[] args) {
        String orderNo = getInstance().GenerateOrder();
        System.out.println(orderNo);
    }
}
